package vue;

import controller.ControllerSaisirJoueur;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

/**
 * Classe VueSaisirJoueur qui gère les composants de la fenêtre. Elle est appelée
 * au moment où le joueur a choisi quel mode il voulait (1vs1 ou 1 vs CPU)
 * @author Florian MININ & Khémon BEH
 */
public class VueSaisirJoueur extends JFrame {

    /**
     * Variable d'instance 
     */
    public final static String BTN_FR = "FR";
    public final static String BTN_EN = "EN";
    public final static String BTN_OK = "OK";

    /**
     * Attributs
     */
    private static ResourceBundle bundle; 
    private JPanel contentPane;
    private JTextField textFieldNomJoueur_1;
    private JTextField textFieldNomJoueur_2;
    private JButton btnLangueFR, btnLangueUK, btnOk;
    private JLabel lblJoueur_1, lblJoueur_2, lblSaisirLeNom, lblErreur;
    //booléen qui sert à déterminer si le j2 est le CPU
    private boolean j2estCPU = false;

    /**
     * Create the frame.
     */
    public VueSaisirJoueur(Locale locale) {
        
        setLocale(locale);
        bundle = ResourceBundle.getBundle("international.international", locale);
        
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setBounds(100, 100, 400, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        GridBagLayout gbl_contentPane = new GridBagLayout();
        gbl_contentPane.columnWidths = new int[]{0, 0, 187, 0, 0, 0};
        gbl_contentPane.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0, 0};
        gbl_contentPane.columnWeights = new double[]{0.0, 0.0, 1.0, 0.0, 0.0, Double.MIN_VALUE};
        gbl_contentPane.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
        contentPane.setLayout(gbl_contentPane);

        btnLangueFR = new JButton("");
        btnLangueFR.setBorderPainted(false);
        btnLangueFR.setContentAreaFilled(false);
        btnLangueFR.setIcon(new ImageIcon("img/Flag-of-France-32.png"));
        GridBagConstraints gbc_btnLangueFR = new GridBagConstraints();
        gbc_btnLangueFR.insets = new Insets(0, 0, 5, 5);
        gbc_btnLangueFR.gridx = 3;
        gbc_btnLangueFR.gridy = 0;
        contentPane.add(btnLangueFR, gbc_btnLangueFR);

        btnLangueUK = new JButton("");
        btnLangueUK.setBorderPainted(false);
        btnLangueUK.setContentAreaFilled(false);
        btnLangueUK.setIcon(new ImageIcon("img/flagUK.png"));
        GridBagConstraints gbc_btnLangueUK_1 = new GridBagConstraints();
        gbc_btnLangueUK_1.insets = new Insets(0, 0, 5, 0);
        gbc_btnLangueUK_1.gridx = 4;
        gbc_btnLangueUK_1.gridy = 0;
        contentPane.add(btnLangueUK, gbc_btnLangueUK_1);
        
        //Label d'erreur
        lblErreur = new JLabel();
        lblErreur.setForeground(Color.RED);
        GridBagConstraints gbc_lblErreur = new GridBagConstraints();
        gbc_lblErreur.anchor = GridBagConstraints.WEST;
        gbc_lblErreur.insets = new Insets(0, 0, 5, 5);
        gbc_lblErreur.gridx = 2;
        gbc_lblErreur.gridy = 0;
        contentPane.add(lblErreur, gbc_lblErreur);

        lblSaisirLeNom = new JLabel(bundle.getString("saisir_nom"));
        GridBagConstraints gbc_lblSaisirLeNom = new GridBagConstraints();
        gbc_lblSaisirLeNom.anchor = GridBagConstraints.WEST;
        gbc_lblSaisirLeNom.insets = new Insets(0, 0, 5, 5);
        gbc_lblSaisirLeNom.gridx = 2;
        gbc_lblSaisirLeNom.gridy = 1;
        contentPane.add(lblSaisirLeNom, gbc_lblSaisirLeNom);

        lblJoueur_1 = new JLabel(bundle.getString("joueur1"));
        GridBagConstraints gbc_lblJoueur_1 = new GridBagConstraints();
        gbc_lblJoueur_1.anchor = GridBagConstraints.EAST;
        gbc_lblJoueur_1.insets = new Insets(0, 0, 5, 5);
        gbc_lblJoueur_1.gridx = 1;
        gbc_lblJoueur_1.gridy = 3;
        contentPane.add(lblJoueur_1, gbc_lblJoueur_1);

        textFieldNomJoueur_1 = new JTextField();
        GridBagConstraints gbc_textField = new GridBagConstraints();
        gbc_textField.anchor = GridBagConstraints.WEST;
        gbc_textField.fill = GridBagConstraints.HORIZONTAL;
        gbc_textField.insets = new Insets(0, 0, 5, 5);
        gbc_textField.gridx = 2;
        gbc_textField.gridy = 3;
        contentPane.add(textFieldNomJoueur_1, gbc_textField);
        textFieldNomJoueur_1.setColumns(10);

        lblJoueur_2 = new JLabel(bundle.getString("joueur2"));
        GridBagConstraints gbc_lblJoueur_2 = new GridBagConstraints();
        gbc_lblJoueur_2.anchor = GridBagConstraints.EAST;
        gbc_lblJoueur_2.insets = new Insets(0, 0, 0, 5);
        gbc_lblJoueur_2.gridx = 1;
        gbc_lblJoueur_2.gridy = 6;
        contentPane.add(lblJoueur_2, gbc_lblJoueur_2);

        textFieldNomJoueur_2 = new JTextField();
        GridBagConstraints gbc_textFieldNomJoueur_2 = new GridBagConstraints();
        gbc_textFieldNomJoueur_2.insets = new Insets(0, 0, 0, 5);
        gbc_textFieldNomJoueur_2.fill = GridBagConstraints.HORIZONTAL;
        gbc_textFieldNomJoueur_2.gridx = 2;
        gbc_textFieldNomJoueur_2.gridy = 6;
        contentPane.add(textFieldNomJoueur_2, gbc_textFieldNomJoueur_2);
        textFieldNomJoueur_2.setColumns(10);

        btnOk = new JButton("OK");
        GridBagConstraints gbc_btnOk = new GridBagConstraints();
        gbc_btnOk.insets = new Insets(0, 0, 5, 0);
        gbc_btnOk.fill = GridBagConstraints.BOTH;
        gbc_btnOk.gridwidth = 2;
        gbc_btnOk.gridheight = 2;
        gbc_btnOk.gridx = 3;
        gbc_btnOk.gridy = 5;
        contentPane.add(btnOk, gbc_btnOk);

        //ActionCommand
        btnLangueFR.setActionCommand(BTN_FR);
        btnLangueUK.setActionCommand(BTN_EN);
        btnOk.setActionCommand(BTN_OK);


        pack();
        setTitle(bundle.getString("titre_joueur"));
        setPreferredSize(new Dimension(100, 75));
        setResizable(false);
        setLocationRelativeTo(null);

    }

    /**
     * Méthode d'abonnement des composants au contrôleur
     * @param ctrl
     */
    public void abonneComposants(ControllerSaisirJoueur ctrl) {
        btnLangueFR.addActionListener(ctrl);
        btnLangueUK.addActionListener(ctrl);
        btnOk.addActionListener(ctrl);
        addWindowListener(ctrl);
    }

    /**
     * Méthode qui permet de changer la langue de la vue
     * @param locale
     */
    public void setLangue(Locale locale) {
        if (!bundle.getLocale().equals(locale)) {
            setLocale(locale);
            // on récupere le bundle correspondant a la nouvelle locale
            bundle = ResourceBundle.getBundle("international.international",
                    locale);

            lblJoueur_1.setText(bundle.getString("joueur1"));
            lblJoueur_2.setText(bundle.getString("joueur2"));
            lblSaisirLeNom.setText(bundle.getString("saisir_nom"));
            lblErreur.setText("");
            setTitle(bundle.getString("titre_joueur"));
        }
    }

    /*****Accesseurs*******/
    
    public String getTextNameJoueur1() {
        return textFieldNomJoueur_1.getText().toUpperCase();
    }

    public String getTextNameJoueur2() {
        return textFieldNomJoueur_2.getText().toUpperCase();
    }

    public void cacherFenetre() {
        setVisible(false);
    }

    /**
     * Méthode qui cache certains composants dans le cas où le joeuur a choisi
     * 1 vs CPU
     */
    public void modeJouerVsCPU() {
        lblJoueur_2.setVisible(false);
        textFieldNomJoueur_2.setVisible(false);
        j2estCPU = true;
    }

    /**
     * Retourne si le joueur 2 est une IA ou non
     * @return
     */
    public boolean leJ2estCPU(){
        return j2estCPU;
    }

    /**
     * Methode qui affiche une erreur si l'un des deux joueurs n'a pas été nommé
     */
    public void afficheErreurNomVide() {
        lblErreur.setText(bundle.getString("mot_vide"));
    }


    /**
     * Methode qui affiche une erreur si les deux noms des joueurs sont identiques
     */
    public void afficheErreurNomIdentique() {
        lblErreur.setText(bundle.getString("nom_identique"));
    }
}
